home *** CD-ROM | disk | FTP | other *** search
/ Experimental BBS Explossion 3 / Experimental BBS Explossion III.iso / gus / gusp15.zip / GUSPLAY.ASM < prev    next >
Assembly Source File  |  1993-05-21  |  41KB  |  2,273 lines

  1.     Comment &
  2.  
  3.     Gus play routine V 1.5 by Robert Adolfsson - CASCADA
  4.     Not for release!
  5.  
  6.     NosieTracker/SoundTracker/StarTrekker/FastTracker/OctaComposer compatible
  7.  
  8.     &
  9.  
  10.     Jumps
  11.     .286
  12.  
  13. _Code    Segment Para 'PlaySeg'
  14.  
  15.     assume    cs:_Code
  16.  
  17. ;    Publics
  18.  
  19. Public    MainVolume,PlayingPattern,RealPPattern,PatternRow,RealRow,OrderLen,ChanOn,NumChans,Time,SampChans,Bar,BasePort,ErrorCode
  20. Public    LoadMod,ClearMem,StartPlaying,StopPlaying,Init,InitDevice
  21.  
  22. ;    Structures
  23.  
  24. ChanSize    Equ 52
  25.  
  26. ChanInfo    Struc
  27.  
  28. SampOff        dd 0
  29. FreqVal     dw 0
  30. Vol         dw 0
  31. OldVol        dw 0
  32. Fine         dw 0
  33. Repeat         dw 0
  34. RepLen         dw 0
  35. Len         dw 0
  36. Amiga         dw 0
  37. Effect         dw 0
  38. VibratoPek     dw 0
  39. OldVibrato     dw 0
  40. PortTo         dw 0
  41. OldPortTo     dw 0
  42. EffectTime    dw 0
  43. CurrSamp    dw 0
  44. OldSamp        dw 0
  45. Arp         dw 0,0,0
  46. ArpCounter     dw 0
  47. InstSet        dw 0
  48. LoopOnOff    dw 0
  49. OffsetAdd    dw 0
  50. Bar        dw 0
  51.  
  52. ChanInfo    EndS
  53.  
  54. ; Number of voices to use
  55.  
  56. NumVoices    Equ 20
  57.  
  58. ; UltraSound Ports
  59.  
  60. StatusPort    Equ 6h
  61. TimerCtrlPort    Equ 8h
  62. TimerDataPort    Equ 9h
  63. MidiCtrlPort    Equ 100h
  64. MidiDataPort    Equ 101h
  65. ActiveVoicePort    Equ 102h
  66. CommandPort    Equ 103h
  67. DataLowPort    Equ 104h
  68. DataHighPort    Equ 105h
  69. DRAMIOPort    Equ 107h
  70.  
  71. ; UltraSound Commands
  72.  
  73. WriteVoiceMode    Equ 00h
  74. SetVoiceFreq    Equ 01h        ; Value=Freq/Divisor
  75. LoopStartLo    Equ 02h
  76. LoopStartHi    Equ 03h
  77. SampleEndLo    Equ 04h
  78. SampleEndHi    Equ 05h
  79. VolRampRate    Equ 06h
  80. VolRampStart    Equ 07h
  81. VolRampEnd    Equ 08h
  82. SetVolume    Equ 09h
  83. SampleStartLo    Equ 0Ah
  84. SampleStartHi    Equ 0Bh
  85. VoiceBalance    Equ 0Ch
  86. VolumeCtrl    Equ 0Dh
  87. VoicesActive    Equ 0Eh
  88. DMACtrl        Equ 41h
  89. DRAMAddrLo    Equ 43h
  90. DRAMAddrHi    Equ 44h
  91. Initialize    Equ 4Ch
  92. ReadVolume    Equ 89h
  93. VoicePosLo    Equ 8Ah
  94. VoicePosHi    Equ 8Bh
  95. ReadVolCtrl    Equ 8Dh
  96.  
  97. ; Divisors
  98.  
  99. Voices14    Equ 4300
  100. Voices15    Equ 4000
  101. Voices16    Equ 3700
  102. Voices17    Equ 3500
  103. Voices18    Equ 3300
  104. Voices19    Equ 3100
  105. Voices20    Equ 3030
  106. Voices21    Equ 2800
  107. Voices22    Equ 2700
  108. Voices23    Equ 2600
  109. Voices24    Equ 2500
  110. Voices25    Equ 2400
  111. Voices26    Equ 2300
  112. Voices27    Equ 2200
  113. Voices28    Equ 2100
  114. Voices29    Equ 2000
  115. Voices30    Equ 2000
  116. Voices31    Equ 1900
  117. Voices32    Equ 1800
  118.  
  119. ;    Variables
  120.  
  121. MKSign        db 'M.K.FLT46CHN8CHNOCTA'
  122. MKMod        db 0
  123. Info        db 1084 dup (0)
  124. OrderLen    db 0
  125. Restart        db 0
  126. PatternOrder    db 128 dup (0)
  127. SinTab        db 0,25,50,74,98,120,142,162,180,197,212,225,236
  128.         db 244,250,254,255,254,250,244,236,225,212,197,180
  129.         db 162,142,120,98,74,50,25
  130.  
  131. ArpTable    db 70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70
  132.         db 70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,70,68,68,68,68,68,68,68,66,66,66,66,66,66,66,64,64,64,64,64,64,64,64,62,62,62,62,62,62,62,62,60,60,60,60,60,60,60,60,58,58,58,58,58,58
  133.         db 58,58,58,56,56,56,56,56,56,56,56,56,56,54,54,54,54,54,54,54,54,54,54,52,52,52,52,52,52,52,52,52,52,50,50,50,50,50,50,50,50,50,50,50,50,48,48,48,48,48,48,48,48,48,48,48,48,46,46,46,46,46,46,46,46,46,46,46,46,44,44,44,44,44,44,44,44,44,44
  134.         db 44,44,44,44,42,42,42,42,42,42,42,42,42,42,42,42,42,42,40,40,40,40,40,40,40,40,40,40,40,40,40,40,40,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,38,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,36,34,34,34,34,34,34,34,34,34,34,34,34,34
  135.         db 34,34,34,34,34,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,32,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,30,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,28,26,26,26,26,26,26,26,26,26,26,26,26,26
  136.         db 26,26,26,26,26,26,26,26,26,26,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,24,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,22,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20,20
  137.         db 20,20,20,20,20,20,20,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,18,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,14,14,14,14,14,14,14,14,14,14,14,14,14,14
  138.         db 14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,14,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10
  139.         db 10,10,10,10,10,10,10,10,10,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4
  140.         db 4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  141.  
  142. PanRegs        db 6,9,9,6,0,0,0,0,0,0,0,0,0,0,0,0
  143.         db 6,6,9,9,9,6,0,0,0,0,0,0,0,0,0,0
  144.         db 6,6,9,9,9,9,6,6,0,0,0,0,0,0,0,0
  145.  
  146. EvenData
  147.  
  148. AmigaVals    dw 856,808,762,720,678,640,604,570,538,508,480,453 ;C-1 to B-1 Finetune +0.
  149.         dw 428,404,381,360,339,320,302,285,269,254,240,226 ;C-2 to B-2 Finetune +0.
  150.         dw 214,202,190,180,170,160,151,143,135,127,120,113 ;C-3 to B-3 Finetune +0.
  151.  
  152.         dw 850,802,757,715,674,637,601,567,535,505,477,450 ;C-1 to B-1 Finetune +1.
  153.         dw 425,401,379,357,337,318,300,284,268,253,239,225 ;C-2 to B-2 Finetune +1.
  154.         dw 213,201,189,179,169,159,150,142,134,126,119,113 ;C-3 to B-3 Finetune +1.
  155.  
  156.         dw 844,796,752,709,670,632,597,563,532,502,474,447 ;C-1 to B-1 Finetune +2.
  157.         dw 422,398,376,355,335,316,298,282,266,251,237,224 ;C-2 to B-2 Finetune +2.
  158.         dw 211,199,188,177,167,158,149,141,133,125,118,112 ;C-3 to B-3 Finetune +2.
  159.  
  160.         dw 838,791,746,704,665,628,592,559,528,498,470,444 ;C-1 to B-1 Finetune +3.
  161.         dw 419,395,373,352,332,314,296,280,264,249,235,222 ;C-2 to B-2 Finetune +3.
  162.         dw 209,198,187,176,166,157,148,140,132,125,118,111 ;C-3 to B-3 Finetune +3.
  163.  
  164.         dw 832,785,741,699,660,623,588,555,524,495,467,441 ;C-1 to B-1 Finetune +4.
  165.         dw 416,392,370,350,330,312,294,278,262,247,233,220 ;C-2 to B-2 Finetune +4.
  166.         dw 208,196,185,175,165,156,147,139,131,124,117,110 ;C-3 to B-3 Finetune +4.
  167.  
  168.         dw 826,779,736,694,655,619,584,551,520,491,463,437 ;C-1 to B-1 Finetune +5.
  169.         dw 413,390,368,347,328,309,292,276,260,245,232,219 ;C-2 to B-2 Finetune +5.
  170.         dw 206,195,184,174,164,155,146,138,130,123,116,109 ;C-3 to B-3 Finetune +5.
  171.  
  172.         dw 820,774,730,689,651,614,580,547,516,487,460,434 ;C-1 to B-1 Finetune +6.
  173.         dw 410,387,365,345,325,307,290,274,258,244,230,217 ;C-2 to B-2 Finetune +6.
  174.         dw 205,193,183,172,163,154,145,137,129,122,115,109 ;C-3 to B-3 Finetune +6.
  175.  
  176.         dw 814,768,725,684,646,610,575,543,513,484,457,431 ;C-1 to B-1 Finetune +7.
  177.         dw 407,384,363,342,323,305,288,272,256,242,228,216 ;C-2 to B-2 Finetune +7.
  178.         dw 204,192,181,171,161,152,144,136,128,121,114,108 ;C-3 to B-3 Finetune +7.
  179.  
  180.         dw 907,856,808,762,720,678,640,604,570,538,504,480 ;C-1 to B-1 Finetune -8.
  181.         dw 453,428,404,381,360,339,320,302,285,269,254,240 ;C-2 to B-2 Finetune -8.
  182.         dw 226,214,202,190,180,170,160,151,143,135,127,120 ;C-3 to B-3 Finetune -8.
  183.  
  184.         dw 900,850,802,757,715,675,636,601,567,535,505,477 ;C-1 to B-1 Finetune -7.
  185.         dw 450,425,401,379,357,337,318,300,284,268,253,238 ;C-2 to B-2 Finetune -7.
  186.         dw 225,212,200,189,179,169,159,150,142,134,126,119 ;C-3 to B-3 Finetune -7.
  187.  
  188.         dw 894,844,796,752,709,670,632,597,563,532,502,474 ;C-1 to B-1 Finetune -6.
  189.         dw 447,422,398,376,355,335,316,298,282,266,251,237 ;C-2 to B-2 Finetune -6.
  190.         dw 223,211,199,188,177,167,158,149,141,133,125,118 ;C-3 to B-3 Finetune -6.
  191.  
  192.         dw 887,838,791,746,704,665,628,592,559,528,498,470 ;C-1 to B-1 Finetune -5.
  193.         dw 444,419,395,373,352,332,314,296,280,264,249,235 ;C-2 to B-2 Finetune -5.
  194.         dw 222,209,198,187,176,166,157,148,140,132,125,118 ;C-3 to B-3 Finetune -5.
  195.  
  196.         dw 881,832,785,741,699,660,623,588,555,524,494,467 ;C-1 to B-1 Finetune -4.
  197.         dw 441,416,392,370,350,330,312,294,278,262,247,233 ;C-2 to B-2 Finetune -4.
  198.         dw 220,208,196,185,175,165,156,147,139,131,123,117 ;C-3 to B-3 Finetune -4.
  199.  
  200.         dw 875,826,779,736,694,655,619,584,551,520,491,463 ;C-1 to B-1 Finetune -3.
  201.         dw 437,413,390,368,347,338,309,292,276,260,245,232 ;C-2 to B-2 Finetune -3.
  202.         dw 219,206,195,184,174,164,155,146,138,130,123,116 ;C-3 to B-3 Finetune -3.
  203.  
  204.         dw 868,820,774,730,689,651,614,580,547,516,487,460 ;C-1 to B-1 Finetune -2.
  205.         dw 434,410,387,365,345,325,307,290,274,258,244,230 ;C-2 to B-2 Finetune -2.
  206.         dw 217,205,193,183,172,163,154,145,137,129,122,115 ;C-3 to B-3 Finetune -2.
  207.  
  208.         dw 862,814,768,725,684,646,610,575,543,513,484,457 ;C-1 to B-1 Finetune -1.
  209.         dw 431,407,384,363,342,323,305,288,272,256,242,228 ;C-2 to B-2 Finetune -1.
  210.         dw 216,203,192,181,171,161,152,144,136,128,121,114 ;C-3 to B-3 Finetune -1.
  211.  
  212. GusVol        dw 20000,39120,41376,42656,43936,45072,45696,46240,46848,47408
  213.         dw 47952,48528,49072,49360,49632,49920,50160,50432,50704,50928
  214.         dw 51168,51424,51680,51952,52160,52448,52672,52912,53152,53312
  215.         dw 53440,53584,53664,53808,53952,54048,54144,54288,54400,54496
  216.         dw 54608,54720,54832,54944,55072,55184,55312,55440,55552,55696
  217.         dw 55760,55888,56016,56096,56240,56304,56448,56528,56672,56752
  218.         dw 56896,56976,57136,57216
  219.  
  220. SampOffset    dd 31 dup (0)
  221. SampLen        dw 31 dup (0)
  222. SampVol        dw 31 dup (0)
  223. SampFine    dw 31 dup (0)
  224. SampRep        dw 31 dup (0)
  225. SampRepLen    dw 31 dup (0)
  226.  
  227. BasePort    dw 220h
  228. FileHandle    dw 0
  229. NumChans    dw 4            ; 4,6 or 8 (Defualt = 4)
  230. ChanOn        dw 0FFh
  231. ChanOnCount    dw 0
  232. PatternSpeed    dw 0
  233. PatternCount    dw 0
  234. PatternRow    dw 0
  235. RealRow        dw 0
  236. PlayingPattern    dw 0
  237. RealPPattern    dw 0
  238. MainVolume    dw 64
  239. TempVol        dw 0
  240. ErrorCode    dw 0
  241.  
  242. FreqTable    dw 908 dup (0)
  243.  
  244. PatternPek    equ this DWord
  245. BytePattern    dw 0
  246. SegPattern    dw 0
  247.  
  248. SampMem        dw 0
  249. PatternMem    dw 0
  250. BreakData    dw 0
  251. OldTimer    dd 0
  252. GUSMem        dd 0
  253. Speed        dd 0
  254. SpeedAdd    dd 0
  255. Counter        dw 0
  256. Time        dd 0
  257. JumpOldTimer    dw 0
  258.  
  259. SampChans    ChanInfo 8 dup (<>)
  260.  
  261. ;     Macros
  262.  
  263. NopLoop        Macro    Nops
  264. Local    NopLoop
  265.  
  266.     push    cx
  267.     mov    cx,Nops
  268. NopLoop:
  269.     nop
  270.     loop    NopLoop
  271.     pop    cx
  272.  
  273.         EndM
  274.  
  275. ;    The Code
  276.  
  277. Even
  278.  
  279.     assume    ds:_Code
  280.  
  281. Pattern        Proc    Near
  282.  
  283.     pusha
  284.     push    ds
  285.     push    es
  286.  
  287.     mov    ax,_Code
  288.     mov    ds,ax
  289.  
  290.     mov    al,20h
  291.     out    20h,al
  292.     sti
  293.  
  294.     add    Word Ptr [Time],1
  295.     adc    Word Ptr [Time+2],0
  296.  
  297.     inc    [Counter]
  298.     mov    ax,Word Ptr [Speed+2]
  299.     add    Word Ptr [SpeedAdd+2],ax
  300.     mov    ax,Word Ptr [Speed]
  301.     adc    Word Ptr [SpeedAdd],ax
  302.     jc    JumpPattern
  303.     cmp    [Counter],4
  304.     je    ClearNotes
  305.     cmp    [Counter],5
  306.     je    SetNotes
  307.     jmp    EndPattern
  308.  
  309. ClearNotes:
  310.     mov    di,offset [SampChans]
  311.     mov    cx,[NumChans]
  312.     mov    dx,[BasePort]
  313.     add    dx,CommandPort
  314.  
  315. StopVoices:
  316.     dec    dx
  317.     mov    al,Byte Ptr [NumChans]
  318.     sub    al,cl
  319.     out    dx,al
  320.     inc    dx
  321.  
  322.     cmp    [di.InstSet],2
  323.     je    VoiceOff1
  324.     cmp    [di.InstSet],1
  325.     je    VoiceOff2
  326.     cmp    [di.OffsetAdd],0
  327.     jne    VoiceOff1
  328.     jmp    NoVoiceOff
  329.  
  330. VoiceOff2:
  331.     mov    ax,[di.CurrSamp]
  332.     cmp    ax,[di.OldSamp]
  333.     jne    VoiceOff1
  334.     jmp    NoVoiceOff
  335.  
  336. VoiceOff1:
  337.     mov    ax,[di.OldVol]
  338.     mov    [di.OldVol],0
  339.     mov    bx,[MainVolume]
  340.     mul    bx
  341.     shr    ax,6
  342.     adc    ax,0
  343.     mov    bx,ax
  344.     shl    bx,1
  345.     mov    bx,[GusVol+bx]
  346.  
  347.     mov    dx,[BasePort]
  348.     add    dx,CommandPort
  349.  
  350.     mov    al,VolumeCtrl
  351.     out    dx,al
  352.     add    dx,2
  353.     mov    al,3
  354.     out    dx,al
  355.     sub    dx,2
  356.  
  357.     mov    bp,[GusVol]
  358.     mov    ah,0
  359.     cmp    bx,bp
  360.     jb    NoFixVolDir1
  361.     mov    ah,01000000b
  362.     xchg    bx,bp
  363. NoFixVolDir1:
  364.  
  365.     mov    al,VolRampStart
  366.     out    dx,al
  367.     xchg    ax,bx
  368.     inc    dx
  369.     out    dx,ax
  370.     dec    dx
  371.  
  372.     mov    al,VolRampEnd
  373.     out    dx,al
  374.     mov    ax,bp
  375.     inc    dx
  376.     out    dx,ax
  377.     dec    dx
  378.  
  379.     mov    al,VolumeCtrl
  380.     out    dx,al
  381.     mov    al,bh
  382.     add    dx,2
  383.     out    dx,al
  384.     sub    dx,2
  385. NoVoiceOff:
  386.  
  387.     add    di,ChanSize
  388.     dec    cx
  389.     jnz    StopVoices
  390.     jmp    EndPattern
  391.  
  392. SetNotes:
  393.     mov    [Counter],1
  394.     mov    di,offset [SampChans]
  395.     mov    cx,[NumChans]
  396.     mov    dx,[BasePort]
  397.     add    dx,CommandPort
  398.  
  399. ChangeSamps:
  400.     dec    dx
  401.     mov    al,Byte Ptr [NumChans]
  402.     sub    al,cl
  403.     out    dx,al
  404.     inc    dx
  405.  
  406.     cmp    [di.InstSet],2
  407.     je    SampChange1
  408.     cmp    [di.InstSet],1
  409.     je    SampChange2
  410.     cmp    [di.OffsetAdd],0
  411.     jne    ChangeOffset
  412.     jmp    NoChangeSamp
  413.  
  414. ChangeOffset:
  415.     mov    al,SampleStartLo
  416.     out    dx,al
  417.     inc    dx
  418.     mov    ax,Word Ptr [di.SampOff]
  419.     mov    bp,Word Ptr [di.SampOff+2]
  420.     add    ax,[di.OffsetAdd]
  421.     adc    bp,0
  422.     shr    ax,7
  423.     shl    bp,9
  424.     or    ax,bp
  425.     out    dx,ax
  426.     dec    dx
  427.     mov    al,SampleStartHi
  428.     out    dx,al
  429.     inc    dx
  430.     mov    ax,Word Ptr [di.SampOff]
  431.     add    ax,[di.OffsetAdd]
  432.     shl    ax,9
  433.     out    dx,ax
  434.     dec    dx
  435.     sub    dx,CommandPort
  436.     Rept    6
  437.     in    al,dx
  438.     EndM
  439.     add    dx,CommandPort
  440.     jmp    NoChangeSamp
  441.  
  442. SampChange1:
  443.     mov    al,WriteVoiceMode
  444.     out    dx,al
  445.     add    dx,2
  446.     mov    al,3
  447.     out    dx,al
  448.     sub    dx,DataHighPort
  449.     Rept    6
  450.     in    al,dx
  451.     EndM
  452.     add    dx,CommandPort
  453.  
  454.     mov    al,SampleStartLo
  455.     out    dx,al
  456.     inc    dx
  457.     mov    ax,Word Ptr [di.SampOff]
  458.     mov    bp,Word Ptr [di.SampOff+2]
  459.     add    ax,[di.OffsetAdd]
  460.     adc    bp,0
  461.     shr    ax,7
  462.     shl    bp,9
  463.     or    ax,bp
  464.     out    dx,ax
  465.     dec    dx
  466.     mov    al,SampleStartHi
  467.     out    dx,al
  468.     inc    dx
  469.     mov    ax,Word Ptr [di.SampOff]
  470.     add    ax,[di.OffsetAdd]
  471.     shl    ax,9
  472.     out    dx,ax
  473.     sub    dx,DataLowPort
  474.     Rept    6
  475.     in    al,dx
  476.     EndM
  477.     add    dx,CommandPort
  478.  
  479.     mov    ax,[di.OldSamp]
  480.     cmp    ax,[di.CurrSamp]
  481.     je    NoChangeSamp
  482.  
  483.     mov    al,SampleEndLo
  484.     out    dx,al
  485.     inc    dx
  486.     mov    ax,Word Ptr [di.SampOff]
  487.     mov    bp,Word Ptr [di.SampOff+2]
  488.     add    ax,[di.Len]
  489.     adc    bp,0
  490.     shr    ax,7
  491.     shl    bp,9
  492.     or    ax,bp
  493.     out    dx,ax
  494.     dec    dx
  495.     mov    al,SampleEndHi
  496.     out    dx,al
  497.     inc    dx
  498.     mov    ax,Word Ptr [di.SampOff]
  499.     add    ax,[di.Len]
  500.     shl    ax,9
  501.     out    dx,ax
  502.     dec    dx
  503.  
  504.     mov    al,LoopStartLo
  505.     out    dx,al
  506.     inc    dx
  507.     mov    ax,Word Ptr [di.SampOff]
  508.     mov    bp,Word Ptr [di.SampOff+2]
  509.     add    ax,[di.Repeat]
  510.     adc    bp,0
  511.     shr    ax,7
  512.     shl    bp,9
  513.     or    ax,bp
  514.     out    dx,ax
  515.     dec    dx
  516.     mov    al,LoopStartHi
  517.     out    dx,al
  518.     inc    dx
  519.     mov    ax,Word Ptr [di.SampOff]
  520.     add    ax,[di.Repeat]
  521.     shl    ax,9
  522.     out    dx,ax
  523.     dec    dx
  524.  
  525.     mov    al,WriteVoiceMode
  526.     out    dx,al
  527.     add    dx,2
  528.     mov    al,3
  529.     out    dx,al
  530.     sub    dx,2
  531.     jmp    NoChangeSamp
  532.  
  533. SampChange2:
  534.     mov    ax,[di.OldSamp]
  535.     cmp    ax,[di.CurrSamp]
  536.     je    NoChangeSamp
  537.  
  538.     mov    al,VoicePosLo
  539.     out    dx,al
  540.     inc    dx
  541.     in    ax,dx
  542.     mov    bx,ax
  543.     dec    dx
  544.     mov    al,VoicePosHi
  545.     out    dx,al
  546.     inc    dx
  547.     in    ax,dx
  548.     dec    dx
  549.     xchg    ax,bx
  550.     shl    ax,7
  551.     shr    bx,9
  552.     and    bx,7Fh
  553.     or    ax,bx
  554.     mov    bx,[di.OldSamp]
  555.     dec    bx
  556.     shl    bx,2
  557.     sub    ax,Word Ptr [SampOffset+bx]
  558.     mov    bx,ax
  559.     cmp    bx,[di.Len]
  560.     jb    NoFixStart
  561.     mov    bx,[di.Len]
  562.     dec    bx
  563. NoFixStart:
  564.  
  565.     cmp    [di.OffsetAdd],0
  566.     jne    NoOffsetEff
  567.     mov    [di.OffsetAdd],bx
  568. NoOffsetEff:
  569.  
  570.     mov    al,SampleStartLo
  571.     out    dx,al
  572.     inc    dx
  573.     mov    ax,Word Ptr [di.SampOff]
  574.     mov    bp,Word Ptr [di.SampOff+2]
  575.     add    ax,[di.OffsetAdd]
  576.     adc    bp,0
  577.     shr    ax,7
  578.     shl    bp,9
  579.     or    ax,bp
  580.     out    dx,ax
  581.     dec    dx
  582.     mov    al,SampleStartHi
  583.     out    dx,al
  584.     inc    dx
  585.     mov    ax,Word Ptr [di.SampOff]
  586.     add    ax,[di.OffsetAdd]
  587.     shl    ax,9
  588.     out    dx,ax
  589.     sub    dx,DataLowPort
  590.     Rept    6
  591.     in    al,dx
  592.     EndM
  593.     add    dx,CommandPort
  594.  
  595.     mov    al,SampleEndLo
  596.     out    dx,al
  597.     inc    dx
  598.     mov    ax,Word Ptr [di.SampOff]
  599.     mov    bp,Word Ptr [di.SampOff+2]
  600.     add    ax,[di.Len]
  601.     adc    bp,0
  602.     shr    ax,7
  603.     shl    bp,9
  604.     or    ax,bp
  605.     out    dx,ax
  606.     dec    dx
  607.     mov    al,SampleEndHi
  608.     out    dx,al
  609.     inc    dx
  610.     mov    ax,Word Ptr [di.SampOff]
  611.     add    ax,[di.Len]
  612.     shl    ax,9
  613.     out    dx,ax
  614.     dec    dx
  615.  
  616.     mov    al,LoopStartLo
  617.     out    dx,al
  618.     inc    dx
  619.     mov    ax,Word Ptr [di.SampOff]
  620.     mov    bp,Word Ptr [di.SampOff+2]
  621.     add    ax,[di.Repeat]
  622.     adc    bp,0
  623.     shr    ax,7
  624.     shl    bp,9
  625.     or    ax,bp
  626.     out    dx,ax
  627.     dec    dx
  628.     mov    al,LoopStartHi
  629.     out    dx,al
  630.     inc    dx
  631.     mov    ax,Word Ptr [di.SampOff]
  632.     add    ax,[di.Repeat]
  633.     shl    ax,9
  634.     out    dx,ax
  635.     dec    dx
  636.  
  637.     mov    al,WriteVoiceMode
  638.     out    dx,al
  639.     add    dx,2
  640.     mov    al,Byte Ptr [di.LoopOnOff]
  641.     out    dx,al
  642.     sub    dx,DataHighPort
  643.     Rept    6
  644.     in    al,dx
  645.     EndM
  646.     add    dx,CommandPort
  647. NoChangeSamp:
  648.  
  649.     mov    ax,[di.Vol]
  650.     cmp    ax,[di.OldVol]
  651.     je    NoSetBar
  652.     mov    [di.Bar],ax
  653. NoSetBar:
  654.  
  655.     mov    [TempVol],ax
  656.     mov    ax,[Counter]
  657.     test    [ChanOn],ax
  658.     jnz    NoChanOff
  659.     mov    [TempVol],0
  660.     mov    [di.Bar],0
  661. NoChanOff:
  662.  
  663.     mov    ax,[di.OldVol]
  664.     mov    bx,[MainVolume]
  665.     mul    bx
  666.     shr    ax,6
  667.     adc    ax,0
  668.     mov    bx,ax
  669.     shl    bx,1
  670.     mov    bx,[GusVol+bx]
  671.     mov    ax,[TempVol]
  672.     mov    bp,[MainVolume]
  673.     mul    bp
  674.     shr    ax,6
  675.     adc    ax,0
  676.     mov    bp,ax
  677.     shl    bp,1
  678.     mov    bp,[GusVol+bp]
  679.  
  680.     mov    dx,bp
  681.     mov    dl,bh
  682.     cmp    dl,dh
  683.     jne    SetVol
  684.  
  685.     mov    dx,[BasePort]
  686.     add    dx,CommandPort
  687.  
  688.     mov    al,VolumeCtrl
  689.     out    dx,al
  690.     add    dx,2
  691.     mov    al,3
  692.     out    dx,al
  693.     sub    dx,2
  694.  
  695.     mov    al,SetVolume
  696.     out    dx,al
  697.     mov    ax,bp
  698.     inc    dx
  699.     out    dx,ax
  700.     dec    dx
  701.     jmp    NoSetVol
  702.  
  703. SetVol:
  704.     mov    dx,[BasePort]
  705.     add    dx,CommandPort
  706.  
  707.     mov    al,VolumeCtrl
  708.     out    dx,al
  709.     add    dx,2
  710.     mov    al,3
  711.     out    dx,al
  712.     sub    dx,2
  713.  
  714.     mov    ah,0
  715.     cmp    bx,bp
  716.     jb    NoFixVolDir
  717.     mov    ah,01000000b
  718.     xchg    bx,bp
  719. NoFixVolDir:
  720.  
  721.     mov    dx,[BasePort]
  722.     add    dx,CommandPort
  723.     mov    al,VolRampStart
  724.     out    dx,al
  725.     xchg    ax,bx
  726.     inc    dx
  727.     out    dx,ax
  728.     dec    dx
  729.  
  730.     mov    al,VolRampEnd
  731.     out    dx,al
  732.     mov    ax,bp
  733.     inc    dx
  734.     out    dx,ax
  735.     dec    dx
  736.  
  737.     mov    al,VolumeCtrl
  738.     out    dx,al
  739.     mov    al,bh
  740.     add    dx,2
  741.     out    dx,al
  742.     sub    dx,2
  743. NoSetVol:
  744.  
  745.     mov    al,SetVoiceFreq
  746.     out    dx,al
  747.     inc    dx
  748.     mov    ax,[di.FreqVal]
  749.     out    dx,ax
  750.     dec    dx
  751.  
  752.     shl    [Counter],1
  753.     add    di,ChanSize
  754.     dec    cx
  755.     jnz    ChangeSamps
  756.  
  757.     mov    di,offset [SampChans]
  758.     mov    cx,[NumChans]
  759.  
  760. StartVoices:
  761.     dec    dx
  762.     mov    al,Byte Ptr [NumChans]
  763.     sub    al,cl
  764.     out    dx,al
  765.     inc    dx
  766.  
  767.     cmp    [di.InstSet],2
  768.     jne    NoVoiceStart
  769.  
  770.     mov    al,WriteVoiceMode
  771.     out    dx,al
  772.     add    dx,2
  773.     mov    al,Byte Ptr [di.LoopOnOff]
  774.     out    dx,al
  775.     sub    dx,DataHighPort
  776.     Rept    6
  777.     in    al,dx
  778.     EndM
  779.     add    dx,CommandPort
  780. NoVoiceStart:
  781.  
  782.     mov    [di.InstSet],0
  783.     mov    [di.OffsetAdd],0
  784.  
  785.     add    di,ChanSize
  786.     dec    cx
  787.     jnz    StartVoices
  788.     jmp    EndPattern
  789.  
  790. JumpPattern:
  791.  
  792.     mov    [Counter],0
  793.  
  794.     dec    Word Ptr [PatternCount]
  795.     jnz    DoEffects
  796.     jmp    DoPattern
  797. DoEffects:
  798.  
  799.     mov    di,offset [SampChans]
  800.     mov    cx,[NumChans]
  801.  
  802. EffectLoop:
  803.  
  804.     mov    ax,[di.Vol]
  805.     mov    [di.OldVol],ax
  806.  
  807.     inc    [di.EffectTime]
  808.     add    [di.ArpCounter],2
  809.     cmp    [di.ArpCounter],6
  810.     jb    NoWrapArp
  811.     mov    [di.ArpCounter],0
  812. NoWrapArp:
  813.     mov    ax,[di.Effect]
  814.     cmp    ax,0
  815.     jne    DoEffect
  816.     jmp    NoEffect
  817. DoEffect:
  818.     mov    bl,al
  819.     mov    bh,0
  820.     cmp    bl,0Eh
  821.     je    DoEEffects
  822.     shl    bx,1
  823.     jmp    [EffectJumps+bx]
  824. DoEEffects:
  825.     mov    bl,ah
  826.     and    ah,0Fh
  827.     shr    bl,4
  828.     shl    bx,1
  829.     jmp    [EEffectJumps+bx]
  830. Arpeggio:
  831.     mov    bx,[di.ArpCounter]
  832.     mov    bx,[di.Arp+bx]
  833.     shl    bx,1
  834.     mov    ax,Word Ptr [FreqTable+bx]
  835.     mov    [di.FreqVal],ax
  836.     jmp    NoEffect
  837. PortUp:
  838.     xchg    ah,al
  839.     mov    ah,0
  840.     mov    bp,[di.Fine]
  841.     mov    bp,[AmigaVals+35*2+bp]
  842.     mov    bx,[di.Amiga]
  843.     sub    bx,ax
  844.     jnc    NoFix1
  845.     mov    bx,bp
  846. NoFix1:
  847.     cmp    bx,bp
  848.     jae    NotSmall1
  849.     mov    bx,bp
  850. NotSmall1:
  851.     mov    [di.Amiga],bx
  852.     shl    bx,1
  853.     mov    ax,[FreqTable+bx]
  854.     mov    [di.FreqVal],ax
  855.     jmp    NoEffect
  856. PortDown:
  857.     xchg    ah,al
  858.     mov    ah,0
  859.     mov    bp,[di.Fine]
  860.     mov    bp,[AmigaVals+bp]
  861.     mov    bx,[di.Amiga]
  862.     add    bx,ax
  863.     cmp    bx,bp
  864.     jbe    NotBig1
  865.     mov    bx,bp
  866. NotBig1:
  867.     mov    [di.Amiga],bx
  868.     shl    bx,1
  869.     mov    ax,[FreqTable+bx]
  870.     mov    [di.FreqVal],ax
  871.     jmp    NoEffect
  872. PortToTone:
  873.     xchg    ah,al
  874.     xor    ah,ah
  875.     mov    dx,[di.PortTo]
  876.     mov    bx,[di.Amiga]
  877.     cmp    bx,dx
  878.     jae    NoPortToUp
  879.     add    bx,ax
  880.     cmp    bx,dx
  881.     jna    NoPortToUp
  882.     mov    [di.Amiga],dx
  883. NoPortToUp:
  884.     cmp    bx,dx
  885.     jbe    NoPortToDown
  886.     sub    bx,ax
  887.     jnc    NoPortToError
  888.     mov    bx,dx
  889. NoPortToError:
  890.     cmp    bx,dx
  891.     jnb    NoPortToDown
  892.     mov    bx,dx
  893. NoPortToDown:
  894.     mov    [di.Amiga],bx
  895.     shl    bx,1
  896.     mov    ax,[FreqTable+bx]
  897.     mov    [di.FreqVal],ax
  898.     jmp    NoEffect
  899. Vibrato:
  900.     mov    bp,[di.Fine]
  901.     mov    si,[AmigaVals+bp]
  902.     mov    bp,[AmigaVals+35*2+bp]
  903.     mov    dl,ah
  904.     and    ah,0F0h
  905.     shr    ah,2
  906.     and    dl,0Fh
  907.     mov    bl,Byte Ptr [di.VibratoPek]
  908.     add    bl,ah
  909.     mov    Byte Ptr [di.VibratoPek],bl
  910.     shr    bl,2
  911.     and    bx,1Fh
  912.     mov    al,[SinTab+bx]
  913.     mul    dl
  914.     rol    ax,1
  915.     xchg    ah,al
  916.     and    ah,1
  917.     test    Byte Ptr [di.VibratoPek],128
  918.     jne    VibUp1
  919.     neg    ax
  920. VibUp1:
  921.     add    ax,[di.Amiga]
  922.     cmp    ax,bp
  923.     jae    NoHighVibrato1
  924.     mov    ax,bp
  925. NoHighVibrato1:
  926.     cmp    ax,si
  927.     jbe    NoLowVibrato1
  928.     mov    ax,si
  929. NoLowVibrato1:
  930.     shl    ax,1
  931.     mov    bx,ax
  932.     mov    ax,[FreqTable+bx]
  933.     mov    [di.FreqVal],ax
  934.     jmp    NoEffect
  935. PortToVSlide:
  936.     mov    al,ah
  937.     and    ah,0Fh
  938.     shr    al,4
  939.     sub    ah,al
  940.     mov    al,Byte Ptr [di.Vol]
  941.     sub    al,ah
  942.     jns    NoSlideLow2
  943.     mov    al,0
  944. NoSlideLow2:
  945.     cmp    al,40h
  946.     jb    NoSlideHigh2
  947.     mov    al,3Fh
  948. NoSlideHigh2:
  949.     mov    Byte Ptr [di.Vol],al
  950.     mov    ax,[di.OldPortTo]
  951.     mov    dx,[di.PortTo]
  952.     mov    bx,[di.Amiga]
  953.     cmp    bx,dx
  954.     jae    NoPortToUp2
  955.     add    bx,ax
  956.     cmp    bx,dx
  957.     jna    NoPortToUp2
  958.     mov    [di.Amiga],dx
  959. NoPortToUp2:
  960.     cmp    bx,dx
  961.     jbe    NoPortToDown2
  962.     sub    bx,ax
  963.     jnc    NoPortToError2
  964.     mov    bx,0
  965. NoPortToError2:
  966.     cmp    bx,dx
  967.     jnb    NoPortToDown2
  968.     mov    bx,dx
  969. NoPortToDown2:
  970.     mov    [di.Amiga],bx
  971.     shl    bx,1
  972.     mov    ax,Word Ptr [FreqTable+bx]
  973.     mov    [di.FreqVal],ax
  974.     jmp    NoEffect
  975. VibratoVSlide:
  976.     mov    al,ah
  977.     and    ah,0Fh
  978.     shr    al,4
  979.     sub    ah,al
  980.     mov    al,Byte Ptr [di.Vol]
  981.     sub    al,ah
  982.     jns    NoSlideLow3
  983.     mov    al,0
  984. NoSlideLow3:
  985.     cmp    al,40h
  986.     jb    NoSlideHigh3
  987.     mov    al,3Fh
  988. NoSlideHigh3:
  989.     mov    Byte Ptr [di.Vol],al
  990.     mov    bp,[di.Fine]
  991.     mov    si,[AmigaVals+bp]
  992.     mov    bp,[AmigaVals+35*2+bp]
  993.     mov    ah,Byte Ptr [di.OldVibrato]
  994.     or    ah,Byte Ptr [di.OldVibrato+1]
  995.     mov    dl,ah
  996.     and    ah,0F0h
  997.     shr    ah,2
  998.     and    dl,0Fh
  999.     mov    bl,Byte Ptr [di.VibratoPek]
  1000.     add    bl,ah
  1001.     mov    Byte Ptr [di.VibratoPek],bl
  1002.     shr    bl,2
  1003.     and    bx,1Fh
  1004.     mov    al,[SinTab+bx]
  1005.     mul    dl
  1006.     rol    ax,1
  1007.     xchg    ah,al
  1008.     and    ah,1
  1009.     test    Byte Ptr [di.VibratoPek],128
  1010.     jne    VibUp2
  1011.     neg    ax
  1012. VibUp2:
  1013.     add    ax,[di.Amiga]
  1014.     cmp    ax,bp
  1015.     jae    NoHighVibrato2
  1016.     mov    ax,bp
  1017. NoHighVibrato2:
  1018.     cmp    ax,si
  1019.     jbe    NoLowVibrato2
  1020.     mov    ax,si
  1021. NoLowVibrato2:
  1022.     shl    ax,1
  1023.     mov    bx,ax
  1024.     mov    ax,[FreqTable+bx]
  1025.     mov    [di.FreqVal],ax
  1026.     jmp    NoEffect
  1027. VolSlide:
  1028.     mov    al,ah
  1029.     and    ah,0Fh
  1030.     shr    al,4
  1031.     cmp    al,0
  1032.     je    NoVolSlideUp
  1033.     neg    al
  1034.     mov    ah,al
  1035. NoVolSlideUp:
  1036.     mov    al,Byte Ptr [di.Vol]
  1037.     sub    al,ah
  1038.     jns    NoSlideLow1
  1039.     mov    al,0
  1040. NoSlideLow1:
  1041.     cmp    al,40h
  1042.     jb    NoSlideHigh1
  1043.     mov    al,3Fh
  1044. NoSlideHigh1:
  1045.     mov    Byte Ptr [di.Vol],al
  1046.     jmp    NoEffect
  1047. RetrigNote:
  1048.     cmp    ah,Byte Ptr [di.EffectTime]
  1049.     jne    NoRetrig
  1050.     mov    [di.EffectTime],0
  1051.     mov    [di.InstSet],2
  1052. NoRetrig:
  1053.     jmp    NoEffect
  1054. CutNote:
  1055.     cmp    ah,Byte Ptr [di.EffectTime]
  1056.     jne    NoCutNote
  1057.     mov    [di.Amiga],0
  1058.     mov    [di.FreqVal],0
  1059. NoCutNote:
  1060.     jmp    NoEffect
  1061. DelayNote:
  1062.     cmp    ah,Byte Ptr [di.EffectTime]
  1063.     jne    NoDelayNote
  1064.     mov    [di.InstSet],2
  1065.     mov    [di.VibratoPek],0
  1066.     mov    bx,[di.PortTo]
  1067.     mov    [di.Amiga],bx
  1068.     shl    bx,1
  1069.     mov    bx,[FreqTable+bx]
  1070.     mov    [di.FreqVal],bx
  1071. NoDelayNote:
  1072.     jmp    NoEffect
  1073. NoEffect:
  1074.  
  1075.     add    di,ChanSize
  1076.     dec    cx
  1077.     jz    EndEffects
  1078.     jmp    EffectLoop
  1079. EndEffects:
  1080.     jmp    EndPattern
  1081.  
  1082. DoPattern:
  1083.     mov    ax,[PatternSpeed]
  1084.     mov    [PatternCount],ax
  1085.     cmp    [PatternRow],64
  1086.     jb    NoPatternWrap
  1087.     mov    ax,[PlayingPattern]
  1088.     cmp    al,[OrderLen]
  1089.     jb    NoTrackWrap
  1090.     mov    ax,0
  1091.     cmp    [Restart],78h
  1092.     jae    NoRestart
  1093.     mov    al,[Restart]
  1094. NoRestart:
  1095.     mov    [PlayingPattern],ax
  1096. NoTrackWrap:
  1097.     mov    bx,[PlayingPattern]
  1098.     mov    [RealPPattern],bx
  1099.     inc    [RealPPattern]
  1100.     mov    ah,0
  1101.     mov    al,[PatternOrder+bx]
  1102.     mov    dx,[NumChans]
  1103.     shl    dx,8
  1104.     mul    dx
  1105.     shl    dx,12
  1106.     add    dx,[PatternMem]
  1107.     mov    [SegPattern],dx
  1108.     mov    [BytePattern],ax
  1109.     mov    ax,[BreakData]
  1110.     mov    [PatternRow],ax
  1111.     shl    ax,4
  1112.     add    [BytePattern],ax
  1113.     mov    [BreakData],0
  1114.     inc    [PlayingPattern]
  1115. NoPatternWrap:
  1116.  
  1117.     les    si,[PatternPek]
  1118.     mov    di,offset [SampChans]
  1119.     mov    cx,[NumChans]
  1120.     mov    ax,[PatternRow]
  1121.     mov    [RealRow],ax
  1122.  
  1123. PattLoop:
  1124.  
  1125.     mov    ax,[di.Vol]
  1126.     mov    [di.OldVol],ax
  1127.  
  1128.     mov    bh,es:[si]        ; New Sample
  1129.     mov    bl,es:[si+2]
  1130.     and    bh,0F0h
  1131.     shr    bl,4
  1132.     add    bl,bh
  1133.     je    NoNewSample
  1134.     mov    bh,Byte Ptr [di.CurrSamp]
  1135.     mov    Byte Ptr [di.OldSamp],bh
  1136.     mov    Byte Ptr [di.CurrSamp],bl
  1137.     mov    bh,0
  1138.     dec    bx
  1139.     shl    bx,1
  1140.     mov    ax,[SampVol+bx]
  1141.     cmp    ax,40h
  1142.     jb    NoHighVol
  1143.     mov    ax,3Fh
  1144. NoHighVol:
  1145.     mov    [di.Vol],ax
  1146.     mov    [di.InstSet],1
  1147.     shl    bx,1
  1148.     mov    ax,Word Ptr [SampOffset+bx]
  1149.     mov    Word Ptr [di.SampOff],ax
  1150.     mov    ax,Word Ptr [SampOffset+bx+2]
  1151.     mov    Word Ptr [di.SampOff+2],ax
  1152.     shr    bx,1
  1153.     mov    ax,[SampFine+bx]
  1154.     shl    ax,3
  1155.     mov    [di.Fine],ax
  1156.     shl    ax,3
  1157.     add    [di.Fine],ax
  1158.     mov    [di.LoopOnOff],0
  1159.     mov    ax,[SampLen+bx]
  1160.     mov    [di.Len],ax
  1161.     mov    ax,[SampRep+bx]
  1162.     mov    [di.Repeat],ax
  1163.     mov    ax,[SampRepLen+bx]
  1164.     mov    [di.RepLen],ax
  1165.     cmp    ax,2
  1166.     jbe    NoNewSample
  1167.     mov    [di.LoopOnOff],8
  1168.     mov    ax,[di.Repeat]
  1169.     add    ax,[di.RepLen]
  1170.     cmp    ax,[di.Len]
  1171.     ja    NoNewSample
  1172.     mov    [di.Len],ax
  1173. NoNewSample:
  1174.  
  1175.     mov    bx,es:[si]
  1176.     xchg    bh,bl
  1177.     and    bx,0FFFh
  1178.     je    NoNewNote
  1179.     
  1180.     mov    bl,[ArpTable+bx]
  1181.     mov    bh,0
  1182.     add    bx,[di.Fine]
  1183.     mov    bx,[AmigaVals+bx]
  1184.     mov    [di.PortTo],bx
  1185.     mov    ax,es:[si+2]
  1186.     and    al,0Fh
  1187.     and    ah,0F0h
  1188.     cmp    al,03h
  1189.     je    PortToP
  1190.     cmp    al,05h
  1191.     je    PortToP
  1192.     jmp    NoPortToP
  1193. PortToP:
  1194.     push    cx
  1195.     neg    cx
  1196.     add    cx,[NumChans]
  1197.     mov    ax,1
  1198.     shl    ax,cl
  1199.     test    ax,[ChanOn]
  1200.     je    NoSetPortBar
  1201.     mov    ax,[di.Vol]
  1202.     mov    [di.Bar],ax
  1203. NoSetPortBar:
  1204.     pop    cx
  1205.     jmp    NoNewNote
  1206. NoPortToP:
  1207.     cmp    ax,0D00Eh
  1208.     jne    NewNote
  1209.     mov    al,es:[si+2]
  1210.     cmp    al,0
  1211.     je    NewNote
  1212.     mov    [di.InstSet],0
  1213.     jmp    NoNewNote
  1214. NewNote:
  1215.     mov    [di.InstSet],2
  1216.     mov    [di.VibratoPek],0
  1217.     mov    [di.Amiga],bx
  1218.     shl    bx,1
  1219.     mov    bx,[FreqTable+bx]
  1220.     mov    [di.FreqVal],bx
  1221. NoNewNote:
  1222.  
  1223.     mov    [di.ArpCounter],0
  1224.     mov    ax,es:[si+2]
  1225.     and    al,0Fh
  1226.     mov    [di.Effect],ax
  1227.     cmp    al,7
  1228.     jb    NoSetOldFreq
  1229.     mov    bx,ax
  1230.     and    bh,0F0h
  1231.     cmp    bx,0C00Eh
  1232.     je    NoSetOldFreq
  1233.     cmp    bx,0D00Eh
  1234.     je    NoSetOldFreq
  1235.     mov    bx,[di.Amiga]
  1236.     shl    bx,1
  1237.     mov    bx,[FreqTable+bx]
  1238.     mov    [di.FreqVal],bx
  1239. NoSetOldFreq:
  1240.     mov    bh,0
  1241.     mov    bl,al
  1242.     cmp    bl,0Eh
  1243.     je    DoEPattEffects
  1244.     shl    bx,1
  1245.     jmp    [PattJumps+bx]
  1246. DoEPattEffects:
  1247.     mov    bl,ah
  1248.     and    ah,0Fh
  1249.     shr    bl,4
  1250.     shl    bx,1
  1251.     jmp    [EPattJumps+bx]
  1252. ArpeggioFix:
  1253.     mov    bx,[di.Amiga]
  1254.     mov    bl,[ArpTable+bx]
  1255.     mov    bh,0
  1256.     mov    bp,bx
  1257.     add    bx,[di.Fine]
  1258.     mov    dx,[AmigaVals+bx]
  1259.     mov    [di.Arp],dx
  1260.     xchg    ah,al
  1261.     mov    ah,0
  1262.     mov    dx,ax
  1263.     shr    dx,4
  1264.     and    ax,0Fh
  1265.     shl    dx,1
  1266.     shl    ax,1
  1267.     mov    bx,bp
  1268.     add    bx,dx
  1269.     cmp    bx,70
  1270.     jbe    NoWrapArp1
  1271.     mov    bx,70
  1272. NoWrapArp1:
  1273.     add    bx,[di.Fine]
  1274.     mov    dx,[AmigaVals+bx]
  1275.     mov    [di.Arp+2],dx
  1276.     mov    bx,bp
  1277.     add    bx,ax
  1278.     cmp    bx,70
  1279.     jbe    NoWrapArp2
  1280.     mov    bx,70
  1281. NoWrapArp2:
  1282.     add    bx,[di.Fine]
  1283.     mov    dx,[AmigaVals+bx]
  1284.     mov    [di.Arp+4],dx
  1285.     jmp    NoPattEffect
  1286. PortToFix:
  1287.     cmp    ah,0
  1288.     jne    NoPortPekFix
  1289.     mov    ah,Byte Ptr [di.OldPortTo]
  1290. NoPortPekFix:
  1291.     mov    Byte Ptr [di.OldPortTo],ah
  1292.     mov    Byte Ptr [di.Effect+1],ah
  1293.     jmp    NoPattEffect
  1294. VibratoFix:
  1295.     mov    al,ah
  1296.     and    al,0Fh
  1297.     and    ah,0F0h
  1298.     cmp    al,0
  1299.     jne    NoVibratoFix1
  1300.     mov    al,Byte Ptr [di.OldVibrato]
  1301. NoVibratoFix1:
  1302.     cmp    ah,0
  1303.     jne    NoVibratoFix2
  1304.     mov    ah,Byte Ptr [di.OldVibrato+1]
  1305. NoVibratoFix2:
  1306.     mov    Byte Ptr [di.OldVibrato],al
  1307.     mov    Byte Ptr [di.OldVibrato+1],ah
  1308.     or    al,ah
  1309.     mov    Byte Ptr [di.Effect+1],al
  1310.     jmp    NoPattEffect
  1311. SampleOff:
  1312.     mov    al,0
  1313.     cmp    ax,[di.Len]
  1314.     jb    NoFixOffset
  1315.     mov    ax,[di.Len]
  1316.     dec    ax
  1317. NoFixOffset:
  1318.     mov    [di.OffsetAdd],ax
  1319.     jmp    NoPattEffect
  1320. PosJump:
  1321.     mov    [PatternRow],63
  1322.     mov    Byte Ptr [PlayingPattern],ah
  1323.     jmp    NoPattEffect
  1324. Volume:
  1325.     cmp    ah,40h
  1326.     jb    NoFixVol1
  1327.     mov    ah,3Fh
  1328. NoFixVol1:
  1329.     mov    Byte Ptr [di.Vol],ah
  1330.     jmp    NoPattEffect
  1331. BreakPatt:
  1332.     mov    [PatternRow],63
  1333.     cmp    ah,64h
  1334.     jb    NoFixBreak
  1335.     mov    ah,63h
  1336. NoFixBreak:
  1337.     mov    al,ah
  1338.     and    al,0Fh
  1339.     shr    ah,4
  1340.     shl    ah,1
  1341.     mov    Byte Ptr [BreakData],al
  1342.     add    Byte Ptr [BreakData],ah
  1343.     shl    ah,2
  1344.     add    Byte Ptr [BreakData],ah
  1345.     jmp    NoPattEffect
  1346. SpeedSet:
  1347.     cmp    ah,0
  1348.     je    NoPattEffect
  1349.     cmp    ah,1Fh
  1350.     jbe    UsualSpeed
  1351.  
  1352.     xchg    ah,al
  1353.     mov    ah,0
  1354.     shl    ax,1            ;
  1355.     mov    bl,5            ; Denna bit är för att ställa
  1356.     div    bl            ; Effects till annat än 50Hz
  1357.     mov    dl,al            ; Detta ger automatiskt en annan
  1358.     mov    dh,0            ; patternspeed.; Hz=2*BPM/5
  1359.     mov    ax,0
  1360.     mov    bx,1000
  1361.     div    bx
  1362.     mov    Word Ptr cs:[Speed],ax
  1363.     mov    ax,0
  1364.     div    bx
  1365.     mov    Word Ptr cs:[Speed+2],ax
  1366.     jmp    NoPattEffect
  1367. UsualSpeed:
  1368.     mov    Byte Ptr [PatternSpeed],ah
  1369.     mov    Byte Ptr [PatternCount],ah
  1370.     jmp    NoPattEffect
  1371. FinePortUp:
  1372.     xchg    ah,al
  1373.     mov    ah,0
  1374.     sub    [di.Amiga],ax
  1375.     mov    bx,[di.Fine]
  1376.     mov    bx,[AmigaVals+35*2+bx]
  1377.     cmp    [di.Amiga],bx
  1378.     jae    NoFixFineUp
  1379.     mov    [di.Amiga],bx
  1380. NoFixFineUp:
  1381.     jmp    NoPattEffect
  1382. FinePortDown:
  1383.     xchg    ah,al
  1384.     mov    ah,0
  1385.     add    [di.Amiga],ax
  1386.     mov    bx,[di.Fine]
  1387.     mov    bx,[AmigaVals+bx]
  1388.     cmp    [di.Amiga],bx
  1389.     jbe    NoFixFineDown
  1390.     mov    [di.Amiga],bx
  1391. NoFixFineDown:
  1392.     jmp    NoPattEffect
  1393. FineVolUp:
  1394.     add    Byte Ptr [di.Vol],ah
  1395.     cmp    Byte Ptr [di.Vol],3Fh
  1396.     jbe    NoFixFineVolUp
  1397.     mov    Byte Ptr [di.Vol],3Fh
  1398. NoFixFineVolUp:
  1399.     jmp    NoPattEffect
  1400. FineVolDown:
  1401.     sub    Byte Ptr [di.Vol],ah
  1402.     jnc    NoFixFineVolDown
  1403.     mov    Byte Ptr [di.Vol],0
  1404. NoFixFineVolDown:
  1405.     jmp    NoPattEffect
  1406. NoPattEffect:
  1407.  
  1408.     add    si,4
  1409.     jnc    NoChangeSeg1
  1410.     mov    dx,es
  1411.     add    dx,1000h
  1412.     mov    es,dx
  1413. NoChangeSeg1:
  1414.     mov    [di.EffectTime],0
  1415.     add    di,ChanSize
  1416.     dec    cx
  1417.     jz    EndChannels
  1418.     jmp    PattLoop
  1419. EndChannels:
  1420.  
  1421.     inc    [PatternRow]
  1422.     mov    ax,[NumChans]
  1423.     shl    ax,2
  1424.     add    [BytePattern],ax
  1425.     jnc    EndPattern
  1426.     add    [SegPattern],1000h
  1427. EndPattern:
  1428.  
  1429.     dec    [JumpOldTimer]
  1430.     jnz    NoJumpOld
  1431.     mov    [JumpOldTimer],55
  1432.     pop    es
  1433.     pop    ds
  1434.     popa
  1435.     jmp    DWord Ptr cs:[OldTimer]
  1436. NoJumpOld:
  1437.     pop    es
  1438.     pop    ds
  1439.     popa
  1440.     iret
  1441.  
  1442. Pattern        EndP
  1443.  
  1444. PattJumps    dw offset cs:[ArpeggioFix]    ; 0
  1445.         dw offset cs:[NoPattEffect]    ; 1
  1446.         dw offset cs:[NoPattEffect]    ; 2
  1447.         dw offset cs:[PortToFix]    ; 3
  1448.         dw offset cs:[VibratoFix]    ; 4
  1449.         dw offset cs:[NoPattEffect]    ; 5
  1450.         dw offset cs:[NoPattEffect]    ; 6
  1451.         dw offset cs:[NoPattEffect]    ; 7
  1452.         dw offset cs:[NoPattEffect]    ; 8
  1453.         dw offset cs:[SampleOff]    ; 9
  1454.         dw offset cs:[NoPattEffect]    ; A
  1455.         dw offset cs:[PosJump]        ; B
  1456.         dw offset cs:[Volume]        ; C
  1457.         dw offset cs:[BreakPatt]    ; D
  1458.         dw offset cs:[NoPattEffect]    ; E
  1459.         dw offset cs:[SpeedSet]        ; F
  1460.  
  1461. EPattJumps    dw offset cs:[NoPattEffect]    ; 0
  1462.         dw offset cs:[FinePortUp]    ; 1
  1463.         dw offset cs:[FinePortDown]    ; 2
  1464.         dw offset cs:[NoPattEffect]    ; 3
  1465.         dw offset cs:[NoPattEffect]    ; 4
  1466.         dw offset cs:[NoPattEffect]    ; 5
  1467.         dw offset cs:[NoPattEffect]    ; 6
  1468.         dw offset cs:[NoPattEffect]    ; 7
  1469.         dw offset cs:[NoPattEffect]    ; 8
  1470.         dw offset cs:[NoPattEffect]    ; 9
  1471.         dw offset cs:[FineVolUp]    ; A
  1472.         dw offset cs:[FineVolDown]    ; B
  1473.         dw offset cs:[NoPattEffect]    ; C
  1474.         dw offset cs:[NoPattEffect]    ; D
  1475.         dw offset cs:[NoPattEffect]    ; E
  1476.         dw offset cs:[NoPattEffect]    ; F
  1477.  
  1478. EffectJumps    dw offset cs:[Arpeggio]        ; 0
  1479.         dw offset cs:[PortUp]        ; 1
  1480.         dw offset cs:[PortDown]        ; 2
  1481.         dw offset cs:[PortToTone]    ; 3
  1482.         dw offset cs:[Vibrato]        ; 4
  1483.         dw offset cs:[PortToVSlide]    ; 5
  1484.         dw offset cs:[VibratoVSlide]    ; 6
  1485.         dw offset cs:[NoEffect]        ; 7
  1486.         dw offset cs:[NoEffect]        ; 8
  1487.         dw offset cs:[NoEffect]        ; 9
  1488.         dw offset cs:[VolSlide]        ; A
  1489.         dw offset cs:[NoEffect]        ; B
  1490.         dw offset cs:[NoEffect]        ; C
  1491.         dw offset cs:[NoEffect]        ; D
  1492.         dw offset cs:[NoEffect]        ; E
  1493.         dw offset cs:[NoEffect]        ; F
  1494.  
  1495. EEffectJumps    dw offset cs:[NoEffect]        ; 0
  1496.         dw offset cs:[NoEffect]        ; 1
  1497.         dw offset cs:[NoEffect]        ; 2
  1498.         dw offset cs:[NoEffect]        ; 3
  1499.         dw offset cs:[NoEffect]        ; 4
  1500.         dw offset cs:[NoEffect]        ; 5
  1501.         dw offset cs:[NoEffect]        ; 6
  1502.         dw offset cs:[NoEffect]        ; 7
  1503.         dw offset cs:[NoEffect]        ; 8
  1504.         dw offset cs:[RetrigNote]    ; 9
  1505.         dw offset cs:[NoEffect]        ; A
  1506.         dw offset cs:[NoEffect]        ; B
  1507.         dw offset cs:[CutNote]        ; C
  1508.         dw offset cs:[DelayNote]    ; D
  1509.         dw offset cs:[NoEffect]        ; E
  1510.         dw offset cs:[NoEffect]        ; F
  1511.  
  1512.     assume    ds:nothing
  1513.  
  1514. StartPlaying    Proc    Far
  1515.  
  1516.     pusha
  1517.     push    ds
  1518.     push    es
  1519.  
  1520.     cli
  1521.  
  1522.     mov    [JumpOldTimer],55
  1523.     mov    di,offset cs:[SampChans]
  1524.     mov    cx,cs:[NumChans]
  1525. ClearVarLoop:
  1526.     mov    cs:[di.FreqVal],0
  1527.     mov    cs:[di.Vol],0
  1528.     add    di,ChanSize
  1529.     loop    ClearVarLoop
  1530.  
  1531.     mov    ax,0
  1532.     mov    es,ax
  1533.  
  1534.     mov    bx,es:[20h]
  1535.     mov    ax,es:[22h]
  1536.     mov    Word Ptr cs:[OldTimer],bx
  1537.     mov    Word Ptr cs:[OldTimer+2],ax
  1538.  
  1539.     push    cs
  1540.     pop    ds
  1541.     mov    dx,offset cs:[Pattern]
  1542.  
  1543.     mov    es:[20h],dx
  1544.     mov    es:[22h],ds
  1545.  
  1546.     mov    al,36h
  1547.     out    43h,al
  1548.     mov    al,169
  1549.     out    40h,al
  1550.     mov    al,4
  1551.     out    40h,al
  1552.  
  1553.     mov    ax,0
  1554.     mov    dx,50
  1555.     mov    bx,1000
  1556.     div    bx
  1557.     mov    Word Ptr cs:[Speed],ax
  1558.     mov    ax,0
  1559.     div    bx
  1560.     mov    Word Ptr cs:[Speed+2],ax
  1561.     mov    Word Ptr cs:[SpeedAdd],0
  1562.     mov    Word Ptr cs:[SpeedAdd+2],0
  1563.     mov    [Counter],20
  1564.     mov    Word Ptr [Time],0
  1565.     mov    Word Ptr [Time+2],0
  1566.  
  1567.     mov    dx,cs:[BasePort]    ; Speaker On!!!
  1568.     mov    al,00000001b
  1569.     out    dx,al
  1570.  
  1571.     sti
  1572.  
  1573.     pop    es
  1574.     pop    ds
  1575.     popa
  1576.     ret
  1577.  
  1578. StartPlaying    EndP
  1579.  
  1580. StopPlaying    Proc    Far
  1581.  
  1582.     pusha
  1583.     push    ds
  1584.     push    es
  1585.  
  1586.     cli
  1587.  
  1588.     mov    dx,cs:[BasePort]    ; Speaker Off!!!
  1589.     mov    al,00000011b
  1590.     out    dx,al
  1591.  
  1592.     mov    ax,0
  1593.     mov    es,ax
  1594.  
  1595.     mov    al,36h
  1596.     out    43h,al
  1597.     mov    al,0
  1598.     out    40h,al
  1599.     mov    al,0
  1600.     out    40h,al
  1601.  
  1602.     mov    dx,Word Ptr cs:[OldTimer]
  1603.     mov    ds,Word Ptr cs:[OldTimer+2]
  1604.     mov    es:[20h],dx
  1605.     mov    es:[22h],ds
  1606.     sti
  1607.  
  1608.     mov    dx,cs:[BasePort]
  1609.     add    dx,ActiveVoicePort
  1610.     mov    cx,NumVoices
  1611. VoiceClearL:
  1612.     mov    al,cl
  1613.     dec    al
  1614.     out    dx,al
  1615.     inc    dx
  1616.     mov    al,0
  1617.     out    dx,al
  1618.     add    dx,2
  1619.     mov    al,3    ; Voice Off
  1620.     out    dx,al
  1621.     sub    dx,2
  1622.     mov    al,0Dh
  1623.     out    dx,al
  1624.     add    dx,2
  1625.     mov    al,3    ; Ramp Off
  1626.     out    dx,al
  1627.     sub    dx,3
  1628.     loop    VoiceClearL
  1629.  
  1630.     pop    es
  1631.     pop    ds
  1632.     popa
  1633.     ret
  1634.  
  1635. StopPlaying    EndP
  1636.  
  1637. Init        Proc    Far
  1638.  
  1639.     pusha
  1640.     push    ds
  1641.     push    es
  1642.     mov    cs:[PatternRow],64
  1643.     mov    cs:[PlayingPattern],0
  1644.     mov    cs:[PatternSpeed],6
  1645.     mov    cs:[PatternCount],1
  1646.     pop    es
  1647.     pop    ds
  1648.     popa
  1649.     ret
  1650.  
  1651. Init        EndP
  1652.  
  1653. InitDevice    Proc    Far
  1654.  
  1655.     pusha
  1656.     push    es
  1657.     push    ds
  1658.  
  1659.     mov    si,108*2
  1660.     mov    bp,108
  1661.     mov    cx,908-108+1
  1662. CountLoop:
  1663.     mov    dx,36h
  1664.     mov    ax,9DE4h
  1665.     div    bp
  1666.     mov    dx,100
  1667.     mul    dx
  1668.     mov    bx,Voices20
  1669.     div    bx
  1670.     shr    bx,1
  1671.     adc    bx,0
  1672.     cmp    dx,bx
  1673.     jb    NoHigherFreq
  1674.     inc    ax
  1675. NoHigherFreq:
  1676.     mov    Word Ptr cs:[FreqTable+si],ax
  1677.     inc    bp
  1678.     add    si,2
  1679.     loop    CountLoop
  1680.  
  1681. ;    Init the UltraSound
  1682.  
  1683.     mov    bx,cs:[BasePort]
  1684.     mov    cx,bx
  1685.     add    bx,CommandPort
  1686.     add    cx,DataHighPort
  1687.     mov    dx,bx
  1688.     mov    al,Initialize
  1689.     out    dx,al
  1690.     mov    dx,cx
  1691.     mov    al,0
  1692.     out    dx,al
  1693.     mov    dx,cs:[BasePort]
  1694.     Rept    6
  1695.     in    al,dx
  1696.     EndM
  1697.     mov    dx,bx
  1698.     mov    al,4Ch
  1699.     out    dx,al
  1700.     mov    dx,cx
  1701.     mov    al,1
  1702.     out    dx,al
  1703.     mov    dx,cs:[BasePort]
  1704.     Rept    6
  1705.     in    al,dx
  1706.     EndM
  1707.  
  1708.     mov    dx,bx
  1709.     mov    al,DMACtrl
  1710.     out    dx,al
  1711.     mov    dx,cx
  1712.     mov    al,0
  1713.     out    dx,al
  1714.     mov    dx,bx
  1715.     mov    al,45h
  1716.     out    dx,al
  1717.     mov    dx,cx
  1718.     mov    al,0
  1719.     out    dx,al
  1720.     mov    dx,bx
  1721.     mov    al,49h
  1722.     out    dx,al
  1723.     mov    dx,cx
  1724.     mov    al,0
  1725.     out    dx,al
  1726.  
  1727.     mov    dx,bx
  1728.     mov    al,VoicesActive
  1729.     out    dx,al
  1730.     mov    dx,cx
  1731.     mov    al,NumVoices
  1732.     dec    al
  1733.     or    al,0C0h
  1734.     out    dx,al
  1735.  
  1736.     mov    dx,cs:[BasePort]
  1737.     add    dx,StatusPort
  1738.     in    al,dx
  1739.     mov    dx,bx
  1740.     mov    al,DMACtrl
  1741.     out    dx,al
  1742.     mov    dx,cx
  1743.     in    al,dx
  1744.     mov    dx,bx
  1745.     mov    al,49h
  1746.     out    dx,al
  1747.     mov    dx,cx
  1748.     in    al,dx
  1749.     mov    dx,bx
  1750.     mov    al,8Fh
  1751.     out    dx,al
  1752.     mov    dx,cx
  1753.     in    al,dx
  1754.  
  1755.     push    cx
  1756.     mov    cx,32
  1757. VoiceClearLoop:
  1758.     mov    dx,cs:[BasePort]
  1759.     add    dx,ActiveVoicePort
  1760.     mov    al,cl
  1761.     dec    al
  1762.     out    dx,al
  1763.     inc    dx
  1764.     mov    al,0
  1765.     out    dx,al
  1766.     add    dx,2
  1767.     mov    al,3    ; Voice Off
  1768.     out    dx,al
  1769.     sub    dx,2
  1770.     mov    al,0Dh
  1771.     out    dx,al
  1772.     add    dx,2
  1773.     mov    al,3    ; Ramp Off
  1774.     out    dx,al
  1775.     loop    VoiceClearLoop
  1776.     pop    cx
  1777.  
  1778.     mov    dx,bx
  1779.     mov    al,DMACtrl
  1780.     out    dx,al
  1781.     mov    dx,cx
  1782.     in    al,dx
  1783.     mov    dx,bx
  1784.     mov    al,49h
  1785.     out    dx,al
  1786.     mov    dx,cx
  1787.     in    al,dx
  1788.     mov    dx,bx
  1789.     mov    al,8Fh
  1790.     out    dx,al
  1791.     mov    dx,cx
  1792.     in    al,dx
  1793.  
  1794.     mov    dx,bx
  1795.     mov    al,Initialize
  1796.     out    dx,al
  1797.     mov    dx,cx
  1798.     mov    al,7
  1799.     out    dx,al
  1800.  
  1801.     mov    cx,NumVoices
  1802. SetRampRateLoop:
  1803.     mov    dx,cs:[BasePort]
  1804.     add    dx,ActiveVoicePort
  1805.     mov    al,NumVoices
  1806.     sub    al,cl
  1807.     out    dx,al
  1808.  
  1809.     mov    dx,cs:[BasePort]
  1810.     add    dx,CommandPort
  1811.     mov    al,VolRampRate
  1812.     out    dx,al
  1813.     mov    al,00111111b
  1814.     mov    dx,cs:[BasePort]
  1815.     add    dx,DataHighPort
  1816.     out    dx,al
  1817.  
  1818.     mov    dx,cs:[BasePort]
  1819.     add    dx,CommandPort
  1820.     mov    al,SetVolume
  1821.     out    dx,al
  1822.     mov    ax,cs:[GusVol]
  1823.     mov    dx,cs:[BasePort]
  1824.     add    dx,DataLowPort
  1825.     out    dx,ax
  1826.     loop    SetRampRateLoop
  1827.  
  1828. ;    Finished Initialize (Pheewww!!!!!!!!!!!!!)
  1829.  
  1830.     pop    es
  1831.     pop    ds
  1832.     popa
  1833.     ret
  1834.  
  1835. InitDevice    EndP
  1836.  
  1837. ClearMem    Proc    Far
  1838.  
  1839.     pusha
  1840.     push    es
  1841.     mov    es,cs:[PatternMem]
  1842.     call    DeAlloc
  1843.     pop    es
  1844.     popa
  1845.     ret
  1846.  
  1847. ClearMem    EndP
  1848.  
  1849. LoadMod        Proc    Far
  1850. ; Error if CF set! ax=errorcode.
  1851. ; ax=1, File or path not found.
  1852. ; ax=2, Error loading file.
  1853. ; ax=3, Out of memory.
  1854.  
  1855.     call    FileOpen
  1856.     jnc    NoOpenError
  1857.     mov    ax,[ErrorCode]
  1858.     jmp    NoMod
  1859. NoOpenError:
  1860.     call    ModLoad
  1861.     jnc    NoLoadError
  1862.     mov    ax,[ErrorCode]
  1863.     jmp    NoMod
  1864. NoLoadError:
  1865.     call    FileClose
  1866. NoMod:
  1867.     ret
  1868.  
  1869. LoadMod        EndP
  1870.  
  1871. ModLoad        Proc    Near
  1872.  
  1873.     pusha
  1874.     push    ds
  1875.     push    es
  1876.  
  1877.     mov    cs:[MainVolume],64
  1878.     mov    cx,1084
  1879.     mov    dx,offset cs:[Info]
  1880.     push    cs
  1881.     pop    ds
  1882.     call    FileRead
  1883.     mov    cs:[NumChans],4
  1884.     mov    bp,offset cs:[Info+1080]
  1885.     mov    bx,0
  1886.     mov    cx,4
  1887. TestInst1:
  1888.     mov    al,cs:[bp]
  1889.     cmp    al,cs:[MKSign+bx]
  1890.     jne    NoMK1
  1891.     inc    bp
  1892.     inc    bx
  1893.     loop    TestInst1
  1894.     mov    si,offset cs:[Info+952]
  1895.     mov    cs:[MKMod],1
  1896.     jmp    Load
  1897. NoMK1:
  1898.     mov    bp,offset cs:[Info+1080]
  1899.     mov    bx,4
  1900.     mov    cx,4
  1901. TestInst2:
  1902.     mov    al,cs:[bp]
  1903.     cmp    al,cs:[MKSign+bx]
  1904.     jne    NoMK2
  1905.     inc    bp
  1906.     inc    bx
  1907.     loop    TestInst2
  1908.     mov    si,offset cs:[Info+952]
  1909.     mov    cs:[MKMod],1
  1910.     jmp    Load
  1911. NoMK2:
  1912.     mov    bp,offset cs:[Info+1080]
  1913.     mov    bx,8
  1914.     mov    cx,4
  1915. TestInst3:
  1916.     mov    al,cs:[bp]
  1917.     cmp    al,cs:[MKSign+bx]
  1918.     jne    No6CHN2
  1919.     inc    bp
  1920.     inc    bx
  1921.     loop    TestInst3
  1922.     mov    cs:[MainVolume],48
  1923.     mov    cs:[NumChans],6
  1924.     mov    si,offset cs:[Info+952]
  1925.     mov    cs:[MKMod],1
  1926.     jmp    Load
  1927. No6CHN2:
  1928.     mov    bp,offset cs:[Info+1080]
  1929.     mov    bx,12
  1930.     mov    cx,4
  1931. TestInst4:
  1932.     mov    al,cs:[bp]
  1933.     cmp    al,cs:[MKSign+bx]
  1934.     jne    No8CHN3
  1935.     inc    bp
  1936.     inc    bx
  1937.     loop    TestInst4
  1938.     mov    cs:[MainVolume],32
  1939.     mov    cs:[NumChans],8
  1940.     mov    si,offset cs:[Info+952]
  1941.     mov    cs:[MKMod],1
  1942.     jmp    Load
  1943. No8CHN3:
  1944.     mov    bp,offset cs:[Info+1080]
  1945.     mov    bx,16
  1946.     mov    cx,4
  1947. TestInst5:
  1948.     mov    al,cs:[bp]
  1949.     cmp    al,cs:[MKSign+bx]
  1950.     jne    STMod
  1951.     inc    bp
  1952.     inc    bx
  1953.     loop    TestInst5
  1954.     mov    cs:[MainVolume],32
  1955.     mov    cs:[NumChans],8
  1956.     mov    si,offset cs:[Info+952]
  1957.     mov    cs:[MKMod],1
  1958.     jmp    Load
  1959. STMod:
  1960.     call    MovePoint
  1961.     mov    dx,offset cs:[Info]
  1962.     mov    cx,600
  1963.     call    FileRead
  1964.     mov    si,offset cs:[Info+472]
  1965.     mov    cs:[MKMod],0
  1966.  
  1967. Load:
  1968.     mov    ax,cs:[si-2]
  1969.     mov    Word Ptr cs:[OrderLen],ax
  1970.     mov    di,offset cs:[PatternOrder]
  1971.     mov    cx,128
  1972. CopyOrder:
  1973.     mov    al,cs:[si]
  1974.     mov    cs:[di],al
  1975.     inc    si
  1976.     inc    di
  1977.     loop    CopyOrder
  1978.     mov    si,offset cs:[PatternOrder]
  1979.     mov    cx,128
  1980.     mov    ax,0
  1981. CheckPatt:
  1982.     mov    al,cs:[si]
  1983.     cmp    al,ah
  1984.     jb    NoHigh
  1985.     xchg    ah,al
  1986. NoHigh:
  1987.     inc    si
  1988.     loop    CheckPatt
  1989.     inc    ah
  1990.     xor    al,al
  1991.     mov    bx,cs:[NumChans]
  1992.     mul    bx
  1993.     mov    si,dx
  1994.     mov    di,ax
  1995.     mov    bx,16
  1996.     div    bx
  1997.     mov    bx,ax
  1998.     call    Alloc
  1999.     jnc    NoOutHunk
  2000.     stc
  2001.     mov    cs:[ErrorCode],3
  2002.     jmp    ErrorLoad        ; Fixa nån slags error-flagga.
  2003. NoOutHunk:
  2004.     mov    cs:[PatternMem],ax
  2005.     mov    ds,ax
  2006.  
  2007. LoadLoop:
  2008.     dec    si
  2009.     js    EndBigLoad
  2010.     mov    dx,0
  2011.     mov    cx,65535
  2012.     call    FileRead
  2013.     mov    dx,65535
  2014.     mov    cx,1
  2015.     call    FileRead
  2016.     mov    dx,ds
  2017.     add    dx,1000h
  2018.     mov    ds,dx
  2019.     jmp    Short LoadLoop
  2020. EndBigLoad:
  2021.     mov    cx,di
  2022.     mov    dx,0
  2023.     call    FileRead
  2024.  
  2025.     mov    cx,15
  2026.     cmp    cs:[MKMod],1
  2027.     jne    NoMK
  2028.     mov    cx,31
  2029. NoMK:
  2030.     mov    bx,4096
  2031.     call    Alloc
  2032.     mov    cs:[SampMem],ax
  2033.     mov    Word Ptr cs:[GUSMem],0
  2034.     mov    Word Ptr cs:[GUSMem+2],0
  2035.     mov    si,offset cs:[Info+42]
  2036.     mov    bp,0
  2037. LoadIns:
  2038.     push    cx
  2039.     mov    Word Ptr cs:[SampLen+bp],0
  2040.     mov    cx,cs:[si]
  2041.     add    si,2
  2042.     xchg    ch,cl
  2043.     cmp    cx,2
  2044.     jbe    NoIns
  2045.     shl    cx,1
  2046.     mov    cs:[SampLen+bp],cx
  2047.     mov    ds,cs:[SampMem]
  2048.     mov    dx,0
  2049.     call    FileRead
  2050.  
  2051. ;    Lets move the sample to the UltaraSound!
  2052.  
  2053.     push    bp
  2054.     mov    cx,cs:[SampLen+bp]
  2055.     shl    bp,1
  2056.     mov    di,Word Ptr cs:[GUSMem]
  2057.     mov    bl,Byte Ptr cs:[GUSMem+2]
  2058.     mov    Word Ptr [SampOffset+bp],di
  2059.     mov    Byte Ptr [SampOffset+bp+2],bl
  2060.     mov    bp,di
  2061.     mov    di,0
  2062.     mov    dx,cs:[BasePort]
  2063.     add    dx,CommandPort
  2064. MSamp2GUS:
  2065.     mov    al,DRAMAddrLo
  2066.     out    dx,al
  2067.     inc    dx
  2068.     mov    ax,bp
  2069.     out    dx,ax
  2070.     dec    dx
  2071.     mov    al,DRAMAddrHi
  2072.     out    dx,al
  2073.     add    dx,2
  2074.     mov    al,bl
  2075.     out    dx,al
  2076.     add    dx,2
  2077.     mov    al,[di]
  2078.     out    dx,al
  2079.     sub    dx,4
  2080.     inc    di
  2081.     add    bp,1
  2082.     adc    bl,0
  2083.     loop    MSamp2GUS
  2084.     dec    di
  2085.     mov    al,DRAMAddrLo
  2086.     out    dx,al
  2087.     inc    dx
  2088.     mov    ax,bp
  2089.     out    dx,ax
  2090.     dec    dx
  2091.     mov    al,DRAMAddrHi
  2092.     out    dx,al
  2093.     add    dx,2
  2094.     mov    al,bl
  2095.     out    dx,al
  2096.     add    dx,2
  2097.     mov    al,[di]
  2098.     out    dx,al
  2099.     sub    dx,4
  2100.     add    bp,1
  2101.     adc    bl,0
  2102.     mov     Word Ptr cs:[GUSMem],bp
  2103.     mov    Byte Ptr cs:[GUSMem+2],bl
  2104.     pop    bp
  2105.  
  2106. NoIns:
  2107.     mov    ah,0
  2108.     mov    al,cs:[si]
  2109.     inc    si
  2110.     mov    cs:[SampFine+bp],ax
  2111.     mov    al,cs:[si]
  2112.     inc    si
  2113.     mov    Byte Ptr cs:[SampVol+bp],al
  2114.  
  2115.     mov    dx,cs:[SampLen+bp]
  2116.     mov    ax,cs:[si]
  2117.     add    si,2
  2118.     xchg    ah,al
  2119.     mov    cx,cs:[si]
  2120.     add    si,2
  2121.     xchg    ch,cl
  2122.     cmp    cs:[MKMod],1
  2123.     jne    STMod1
  2124.     shl    ax,1
  2125.     shl    cx,1
  2126. STMod1:
  2127.     mov    cs:[SampRepLen+bp],cx
  2128.     add    cx,ax
  2129.     cmp    cx,dx
  2130.     jbe    NoRepFix
  2131.     mov    cx,dx
  2132.     sub    cx,ax
  2133.     mov    cs:[SampRepLen+bp],cx
  2134. NoRepFix:
  2135.     mov    cs:[SampRep+bp],ax
  2136.  
  2137.     add    si,22
  2138.     add    bp,2
  2139.     pop    cx
  2140.     dec    cx
  2141.     jz    Loaded
  2142.     jmp    LoadIns
  2143. Loaded:
  2144.     mov    es,cs:[SampMem]
  2145.     call    DeAlloc
  2146.     mov    cs:[ErrorCode],0
  2147.     clc
  2148.  
  2149. ;    Set Pan Regs!!
  2150.  
  2151. ErrorLoad:
  2152.     mov    cx,cs:[NumChans]
  2153.     mov    bx,cx
  2154.     shr    bx,1
  2155.     sub    bx,2
  2156.     shl    bx,4
  2157. SetPanLoop:
  2158.     mov    dx,cs:[BasePort]
  2159.     add    dx,ActiveVoicePort
  2160.     mov    al,Byte Ptr cs:[NumChans]
  2161.     sub    al,cl
  2162.     out    dx,al
  2163.  
  2164.     mov    dx,cs:[BasePort]
  2165.     add    dx,CommandPort
  2166.     mov    al,VoiceBalance
  2167.     out    dx,al
  2168.     mov    dx,cs:[BasePort]
  2169.     add    dx,DataHighPort
  2170.     mov    al,cs:[PanRegs+bx]
  2171.     out    dx,al
  2172.     inc    bx
  2173.     loop    SetPanLoop
  2174.  
  2175.     pop    es
  2176.     pop    ds
  2177.     popa
  2178.     ret
  2179.  
  2180. ModLoad        EndP
  2181.  
  2182. Alloc        Proc    Near
  2183.  
  2184.     push    bx
  2185.     mov    ax,4800h
  2186.     int    21h
  2187.     pop    bx
  2188.     ret
  2189.  
  2190. Alloc        EndP
  2191.  
  2192. DeAlloc        Proc    Near
  2193.  
  2194.     push    ax
  2195.     push    es
  2196.     mov    ax,4900h
  2197.     int    21h
  2198.     pop    es
  2199.     pop    ax
  2200.     ret
  2201.  
  2202. DeAlloc        EndP
  2203.  
  2204. FileRead    Proc    Near
  2205.  
  2206.     push    ax
  2207.     push    bx
  2208.     push    cx
  2209.     push    dx
  2210.     push    ds
  2211.     mov    ax,3F00h
  2212.     mov    bx,cs:[FileHandle]
  2213.     int    21h
  2214.     pop    ds
  2215.     pop    dx
  2216.     pop    cx
  2217.     pop    bx
  2218.     pop    ax
  2219.     ret
  2220.  
  2221. FileRead    EndP
  2222.  
  2223. FileOpen    Proc    Near
  2224.  
  2225.     push    dx
  2226.     push    ds
  2227.     mov    ax,3D00h
  2228.     int    21h
  2229.     mov    cs:[FileHandle],ax
  2230.     jnc    NoErrorOpen
  2231.     mov    cs:[ErrorCode],1
  2232. NoErrorOpen:
  2233.     pop    ds
  2234.     pop    dx
  2235.     ret
  2236.  
  2237. FileOpen    EndP
  2238.  
  2239. FileClose    Proc    Near
  2240.  
  2241.     push    ax
  2242.     push    bx
  2243.     mov    ax,3E00h
  2244.     mov    bx,cs:[FileHandle]
  2245.     int    21h
  2246.     pop    bx
  2247.     pop    ax
  2248.     ret
  2249.  
  2250. FileClose    EndP
  2251.  
  2252. MovePoint    Proc    Near
  2253.  
  2254.     push    ax
  2255.     push    bx
  2256.     push    cx
  2257.     push    dx
  2258.     mov    ax,4200h
  2259.     mov    bx,cs:[FileHandle]
  2260.     mov    cx,0
  2261.     mov    dx,0
  2262.     int    21h
  2263.     pop    dx
  2264.     pop    cx
  2265.     pop    bx
  2266.     pop    ax
  2267.     ret
  2268.  
  2269. MovePoint    EndP
  2270.  
  2271. _Code    EndS
  2272.  
  2273.     End